package com.lh.jianzhioffer.专项练习.位运算;

import java.math.BigInteger;

/**
 * @author: linghao
 * @since: 2023/2/15
 *
 * 给定两个 01 字符串 a 和 b ，请计算它们的和，并以二进制字符串的形式输出。
 * 输入为 非空 字符串且只包含数字 1 和 0
 */
public class 二进制加法002 {

    // 这种简单的方法会:次方法位数过长就不能使用
    /*
    如果字符串超过33 位，不能转化为 Integer
    如果字符串超过65 位，不能转化为 Long
    如果字符串超过500000001 位，不能转化为 BigInteger
     */
    public String addBinary1(String a, String b) {
        return  Integer.toBinaryString(Integer.parseInt(a,2)+Integer.parseInt(b,2));
    }

    //遍历字符串进行每位的加减法
    public String addBinary(String a, String b) {
        StringBuffer sb = new StringBuffer();
        int n = Math.max(a.length(),b.length()),carry = 0;
        for(int i =0;i<n;i++){
            carry += i < a.length() ? (a.charAt(a.length() - i -1) - '0') : 0;
            carry += i < b.length() ? (b.charAt(b.length() - i -1) - '0') : 0;
            sb.append((char)(carry%2 +  '0'));   //carry%2 结果要么是0，要么是1
            carry /= 2;
        }
        if(carry > 0){ ////最后如果 则将最高位添加到计算结果的末尾
            sb.append('1');
        }
        sb.reverse();
        return sb.toString();
    }
}
